﻿/*在郑石泉版本基础上，由肖凯进行了大修，半成品状态，还有较大优化空间 */
/* 目前问题1：const vector<string> OrbitParamNames，这个结构体意义不大 */
#pragma once

#include <string>
#include <vector>
#include <iomanip>
#include "TimeSys.h"
using namespace std;

// RINEX文件头数据结构
struct RinexHead {
    string version;             // 版本信息（例：3.02）
    string creatingProgram;     // 生成程序（例：CRU）
    string creatingAgency;      // 生成机构（例：ComNav Technology）
    string creationDate;        // 创建时间（例：20170307 093057 UTC）
    int leapSeconds;            // 闰秒数
    double ionAlpha[4];         // 电离层参数Alpha0-3
    double ionBeta[4];          // 电离层参数Beta0-3
};

// 卫星广播星历数据结构
struct BroadEphemeris {
    string prn;                 // 卫星编号（例：C01）
    int year, month, day;       // 历元日期
    int hour, min;              // 历元时间（时分）
    double sec;                 // 历元秒数（科学计数法）
    double clockBias,clockDrift, clockDriftRate; // 卫星钟差、钟速、钟速变化率
    vector<double> params;      // 轨道参数（15个参数）
};

/**
 * RINEX N 文件读取类
 * 功能：读取、解析、输出RINEX N 格式文件
 */
class ReadN {
public:
    ReadN();                    /* 默认构造函数 */
    ReadN(string filePath);     /* 带文件输入的构造函数 */
/* 公有接口函数 */
public:
    bool set_file(string filePath);      // 设置N文件的路径和文件名
    bool parseFile();                    // 解析文件内容
    RinexHead &get_head();               // 输出文件头指针
    BroadEphemeris* get_Ephemeris(string prn, BaseT time); // 输出星历数据
    bool print_eph();                    // 在控制台打印星历文件
/* 私有函数和成员 */
private:
    string    filePath;                  // 文件路径
    RinexHead header;                    /* 存储文件头数据 */
    vector<BroadEphemeris> ListBroadEph; /* 存储文件体数据 */
    void parseHeaderLine(string& line);
    BroadEphemeris parseEpochLine(string& line);
    void parseDataLine(string& line, BroadEphemeris& eph);
};
